﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ReconocedorSonidosVocales
{
    public partial class Principal : Form
    {
        public ConjuntoMuestras conjuntoMuestras;
        public FuzzyART fuzzyART;
       // public ConjuntoMuestras mustrasLPC;
        //public ConjuntoMuestras mustrasEFCC;
        

        public Principal()
        {
            InitializeComponent();
           /* mustrasMFCC = new ConjuntoMuestras("mfcc");
            mustrasLPC = new ConjuntoMuestras("lpc");
            mustrasEFCC = new ConjuntoMuestras("efcc");*/


           // fuzzyART = new FuzzyART(320 * 240, true, this.alpha, this.rho, this.betha);
        }



        private void cargarMuestrasButton_Click(object sender, EventArgs e)
        {
            ReadFile readFile = null;
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.ShowDialog();
            if (!openFileDialog.FileName.ToString().Equals(""))
            {
                readFile = new ReadFile(openFileDialog.FileName);


                List<Muestra> todasLasMuestras = readFile.leerMuestras(readFile.name);
                conjuntoMuestras = new ConjuntoMuestras(readFile.name);
                for (int i = 0; i < todasLasMuestras.Count; i++)
                {
                    switch (((Muestra)todasLasMuestras[i]).vocal.ToString())
                    {
                        case "a":
                            conjuntoMuestras.muestrasA.Add(todasLasMuestras[i]);
                            break;
                        case "e":
                            conjuntoMuestras.muestrasE.Add(todasLasMuestras[i]);
                            break;
                        case "i":
                            conjuntoMuestras.muestrasI.Add(todasLasMuestras[i]);
                            break;
                        case "o":
                            conjuntoMuestras.muestrasO.Add(todasLasMuestras[i]);
                            break;
                        case "u":
                            conjuntoMuestras.muestrasU.Add(todasLasMuestras[i]);
                            break;
                        default:
                            MessageBox.Show("Error muestra no identificada");
                            break;
                    }

                }
                /*chart1.Series["Vocales a"].Points.AddY(muestrasA.Count);
                chart1.Series["Vocales e"].Points.AddY(muestrasA.Count);
                chart1.Series["Vocales i"].Points.AddY(muestrasA.Count);
                chart1.Series["Vocales o"].Points.AddY(muestrasA.Count);
                chart1.Series["Vocales u"].Points.AddY(muestrasA.Count);*/
                
                //cantidadMuestrasTextBox.Text = conjuntoMuestras.muestrasA.Count.ToString();
                mensajeMuestrasLabel.ForeColor = Color.DarkBlue;
                mensajeMuestrasLabel.Text="Muestras tipo "+ conjuntoMuestras.tipo.ToString().ToUpper()+" cargadas.";
            }
        }

        private void Principal_Load(object sender, EventArgs e)
        {
            mensajeMuestrasLabel.Text = "";
            calcularPorcentaje();
           

        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            calcularPorcentaje();
        }
        public void calcularPorcentaje(){
            porcentajeAEntrenarTextBox.Text = (trackBar1.Value * 10).ToString();
        }
        private void porcentajeAEntrenarTextBox_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {

        }

        private void buttonEntrenar_Click(object sender, EventArgs e)
        {
            conjuntoMuestras.seleccionarMuestrasAEntrenar(trackBar1.Value);
            Double betha = 1;
            Double alpha = 0.01;
            Double rho = .9;
            fuzzyART = new FuzzyART(conjuntoMuestras.vectorSize, true, alpha, rho, betha);
            entrenarCadaMuestra();
            probarRed();
        }
        /// <summary>
        /// Toma cada muestra y la entrena en la red
        /// </summary>
        private void entrenarCadaMuestra() {
            for (int i = 0; i < conjuntoMuestras.todasMuestrasAEntrenar.Count; i++)
            {
                Muestra muestraAEntrenar=(Muestra)conjuntoMuestras.todasMuestrasAEntrenar[i];
                fuzzyART.propagateNewInput(muestraAEntrenar.datos,muestraAEntrenar.vocal);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
        public void probarRed() {
            int vocalesAReconocidasCorrectamente = 0;
            int vocalesEReconocidasCorrectamente = 0;
            int vocalesIReconocidasCorrectamente = 0;
            int vocalesOReconocidasCorrectamente = 0;
            int vocalesUReconocidasCorrectamente = 0;
            Double max = conjuntoMuestras.todasMuestrasRestantesAProbar.Count;
            Double paso = 10000 / max;
            for (int i = 0; i < conjuntoMuestras.todasMuestrasRestantesAProbar.Count; i++)
            {
                Muestra muestraAProbar = (Muestra)conjuntoMuestras.todasMuestrasRestantesAProbar[i];
                if (fuzzyART.clasify(muestraAProbar.datos).Equals(muestraAProbar.vocal))
                {
                    switch (muestraAProbar.vocal)
                    {
                        case "a":
                            vocalesAReconocidasCorrectamente++;
                            break;
                        case "e":
                            vocalesEReconocidasCorrectamente++;
                            break;
                        case "i":
                            vocalesIReconocidasCorrectamente++;
                            break;
                        case "o":
                            vocalesOReconocidasCorrectamente++;
                            break;
                        case "u":
                            vocalesUReconocidasCorrectamente++;
                            break;
                    }
                }
                
                progressBar1.Value += (int)paso;
            }
            double t = conjuntoMuestras.todasMuestrasRestantesAProbar.Count;
            progressBar1.Value = progressBar1.Maximum;
            chart1.Series["Total vocales"].Points.AddY(conjuntoMuestras.todasMuestrasRestantesAProbar.Count / 5);
            chart1.Series["Vocales a"].Points.AddY(vocalesAReconocidasCorrectamente);
            chart1.Series["Vocales e"].Points.AddY(vocalesEReconocidasCorrectamente);
            chart1.Series["Vocales i"].Points.AddY(vocalesIReconocidasCorrectamente);
            chart1.Series["Vocales o"].Points.AddY(vocalesOReconocidasCorrectamente);
            chart1.Series["Vocales u"].Points.AddY(vocalesUReconocidasCorrectamente);
            //chart1.Series["Total vocales"].Points.AddY(conjuntoMuestras.todasMuestrasRestantesAProbar.Count/5);
            //chart1.Series["Vocales a"].Points.AddY(vocalesAReconocidasCorrectamente);
            //chart1.Series["Vocales e"].Points.AddY(vocalesEReconocidasCorrectamente);
            //chart1.Series["Vocales i"].Points.AddY(vocalesIReconocidasCorrectamente);
            //chart1.Series["Vocales o"].Points.AddY(vocalesOReconocidasCorrectamente);
            //chart1.Series["Vocales u"].Points.AddY(vocalesUReconocidasCorrectamente);
            double pA = (Convert.ToDouble(vocalesAReconocidasCorrectamente) / conjuntoMuestras.cantidadMuestrasAProbarA * 100);
            double pE = (Convert.ToDouble(vocalesEReconocidasCorrectamente) / conjuntoMuestras.cantidadMuestrasAProbarE * 100);
            double pI = (Convert.ToDouble(vocalesIReconocidasCorrectamente) / conjuntoMuestras.cantidadMuestrasAProbarI * 100);
            double pO = (Convert.ToDouble(vocalesOReconocidasCorrectamente) / conjuntoMuestras.cantidadMuestrasAProbarO * 100);
            double pU = (Convert.ToDouble(vocalesUReconocidasCorrectamente) / conjuntoMuestras.cantidadMuestrasAProbarU * 100);

            StringBuilder s = new StringBuilder();
            s.Append("A:\t" + vocalesAReconocidasCorrectamente.ToString() + "/" + conjuntoMuestras.cantidadMuestrasAProbarA + "\t" + pA.ToString("0.00") + "%\n");
            s.Append("E:\t" + vocalesEReconocidasCorrectamente.ToString() + "/" + conjuntoMuestras.cantidadMuestrasAProbarE + "\t" + pE.ToString("0.00") + "%\n");
            s.Append("I:\t" + vocalesIReconocidasCorrectamente.ToString() + "/" + conjuntoMuestras.cantidadMuestrasAProbarI + "\t" + pI.ToString("0.00") + "%\n");
            s.Append("O:\t" + vocalesOReconocidasCorrectamente.ToString() + "/" + conjuntoMuestras.cantidadMuestrasAProbarO + "\t" + pO.ToString("0.00") + "%\n");
            s.Append("U:\t" + vocalesUReconocidasCorrectamente.ToString() + "/" + conjuntoMuestras.cantidadMuestrasAProbarU + "\t" + pU.ToString("0.00") + "%\n");
            //s.Append("\t\t\t" + (pA * conjuntoMuestras.cantidadMuestrasAProbarA / t + pE * conjuntoMuestras.cantidadMuestrasAProbarE / t + pI * conjuntoMuestras.cantidadMuestrasAProbarI / t + pO * conjuntoMuestras.cantidadMuestrasAProbarO / t + pU * conjuntoMuestras.cantidadMuestrasAProbarU / t).ToString("0.00") + "%");
            s.Append("\t\t\t" + ((pA + pE + pI + pO + pU)/5).ToString("0.00") + "%");


            MessageBox.Show(s.ToString());


        }
    }
}
